这个例子的程序比较简单
main函数
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
func3
1 | int __fastcall func3(__int64 a1) |
func
1 | int __fastcall func(const char *a1) |
可以看到漏洞点是在func,那我们怎么写脚本呢
- 载入程序,获得控制流程图,进而获取strcpy函数和func3函数的地址
- 构造命令行参数,创建一个entry_state和simulation_manager
- 从simulation_manager中找到满足当前执行到strcpy,而且strcpy的源地址真是我们输入的argv[2]那时候的状态,我们再输出argv[1],那么就找到了如何到达那个strcpy的argv[1]了
完整代码如下:(跟着官方的代码敲了一下)
1 | # -*- coding: utf-8 -*- |
运行结果:
1 | (angr) angr@e766290917a5:~/angr-workdir/examples/strcpy_find$ python angrexp.py |
验证
1 | (angr) angr@e766290917a5:~/angr-workdir/examples/strcpy_find$ ./strcpy_test "Totally not the password..." "giantbranch test" |
Reference
https://docs.angr.io/docs/examples.html#vulnerability-discovery